package controllers;

import play.jobs.Job;

import javax.activation.DataHandler;
import javax.activation.DataSource;
import javax.activation.FileDataSource;
import javax.mail.*;
import javax.mail.internet.InternetAddress;
import javax.mail.internet.MimeBodyPart;
import javax.mail.internet.MimeMessage;
import javax.mail.internet.MimeMultipart;
import java.io.ByteArrayInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.util.Date;
import java.util.Properties;

public class MailSender {

    public static void main(String[] args) {

    }

    public static void SendMessage(String to, String theme, String text, String filename, String from, String password)
    {
        Properties props = new Properties();
        String tmp = from.split("@")[1];
        if(tmp.contains("bk") || tmp.contains("list") || tmp.contains("inbox") || (tmp.contains("mail") && !tmp.contains("gmail")))
        {
            tmp = "mail.ru";
        }
        else if(tmp.contains(("gmail")))
        {
            props.put("mail.smtp.starttls.enable","true");
        }
        String host = "smtp."+tmp;

        props.put("mail.smtp.host", "465");
        // Включение debug-режима
        props.put("mail.debug", "true");
        //Включение авторизации
        props.put("mail.smtp.auth","true");
        //props.put("mail.smtp.host", host);
        props.put("mail.smtp.user", from);
        props.put("mail.smtp.password",password);

        Session session = Session.getInstance(props);

        try {

            Transport bus = session.getTransport("smtp");

            bus.connect(host, from, password);

            // Создание объекта сообщения
            Message msg = new MimeMessage(session);

            // Установка атрибутов сообщения
            msg.setFrom(new InternetAddress(from));
            InternetAddress[] address = {new InternetAddress(to)};
            msg.setRecipients(Message.RecipientType.TO, address);
            // Парсинг списка адресов разделённых пробелами. Строгий синтаксис
            msg.setRecipients(Message.RecipientType.CC,
                    InternetAddress.parse(to, true));
            // Парсинг списка адресов разделённых пробелами. Более мягкий синтаксис.
            msg.setRecipients(Message.RecipientType.BCC,
                    InternetAddress.parse(to, false));

            MimeBodyPart mbp1 = new MimeBodyPart();
            mbp1.setText(text);

            // create the second message part
            Multipart mp = new MimeMultipart();
            mp.addBodyPart(mbp1);
            if(filename!="")
            {
                MimeBodyPart mbp2 = new MimeBodyPart();
                FileDataSource fds = new FileDataSource(filename);
                mbp2.setDataHandler(new DataHandler(fds));
                mbp2.setFileName(fds.getName());
                mp.addBodyPart(mbp2);
            }

            // add the Multipart to the message
            msg.setContent(mp);
            msg.setHeader(theme, theme);

            // set the Date: header
            msg.setSentDate(new Date());
            bus.sendMessage(msg, address);

            bus.close();

        }
        catch (MessagingException mex) {
            // Печать информации обо всех возможных возникших исключениях
            mex.printStackTrace();
            // Получение вложенного исключения
            while (mex.getNextException() != null) {
                // Получение следующего исключения в цепочке
                Exception ex = mex.getNextException();
                ex.printStackTrace();
                if (!(ex instanceof MessagingException)) break;
                else mex = (MessagingException)ex;
            }
        }
    }

    public static void SendMessage(String to, String theme, String text, String filename)
    {
        String from = "ourservicesms@gmail.com";
        String password = "1cegthgfhjkm1";
        String host = "smtp.gmail.com";

        Properties props = new Properties();
        //!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
        props.put("mail.smtp.starttls.enable","true");
        //!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
        props.put("mail.smtp.host", "465");
        // Включение debug-режима
        props.put("mail.debug", "true");
        //Включение авторизации
        props.put("mail.smtp.auth","true");
        props.put("mail.smtp.host", host);
        props.put("mail.smtp.user", from);
        props.put("mail.smtp.password",password);
        props.put("mail.smtp.port","587");

        Session session = Session.getInstance(props);

        try {
            // Получение объекта транспорта для передачи электронного сообщения
            Transport bus = session.getTransport("smtp");

            // Устанавливаем соединение один раз
            // Метод Transport.send() отсоединяется после каждой отправки
            //bus.connect();
            // Обычно для SMTP сервера необходимо указать логин и пароль
            bus.connect(host, from, password);

            // Создание объекта сообщения
            Message msg = new MimeMessage(session);

            // Установка атрибутов сообщения
            msg.setFrom(new InternetAddress(from));
            InternetAddress[] address = {new InternetAddress(to)};
            msg.setRecipients(Message.RecipientType.TO, address);
            // Парсинг списка адресов разделённых пробелами. Строгий синтаксис
            msg.setRecipients(Message.RecipientType.CC,
                    InternetAddress.parse(to, true));
            // Парсинг списка адресов разделённых пробелами. Более мягкий синтаксис.
            msg.setRecipients(Message.RecipientType.BCC,
                    InternetAddress.parse(to, false));


            MimeBodyPart mbp1 = new MimeBodyPart();
            mbp1.setText(text);

            // create the second message part
            Multipart mp = new MimeMultipart();
            mp.addBodyPart(mbp1);
            if(filename!="")
            {
                MimeBodyPart mbp2 = new MimeBodyPart();
                FileDataSource fds = new FileDataSource(filename);
                mbp2.setDataHandler(new DataHandler(fds));
                mbp2.setFileName(fds.getName());
                mp.addBodyPart(mbp2);
            }

            msg.setContent(mp);
            msg.setHeader(theme, theme);

            // set the Date: header
            msg.setSentDate(new Date());
            msg.setSubject(theme);


            bus.sendMessage(msg, address);

            bus.close();

        }
        catch (MessagingException mex) {
            // Печать информации обо всех возможных возникших исключениях
            mex.printStackTrace();
            // Получение вложенного исключения
            while (mex.getNextException() != null) {
                // Получение следующего исключения в цепочке
                Exception ex = mex.getNextException();
                ex.printStackTrace();
                if (!(ex instanceof MessagingException)) break;
                else mex = (MessagingException)ex;
            }
        }
    }

    // Сообщение с типом контента multipart/mixed. Обе части имеют тип контента text/plain.
    public static void setMultipartContent(Message msg, String[] parts) throws MessagingException {
        // Создание и заполнение первой части
        Multipart mp = new MimeMultipart();
        for (int i=0;i<parts.length;i++)
        {
            MimeBodyPart p = new MimeBodyPart();
            p.setText(parts[i]);
        }
        // Установка объекта класса Multipart в качестве контента сообщения
        msg.setContent(mp);
    }

    // Прикрепление файла в качестве вложения. Используется JAF FileDataSource.
    public static void setFileAsAttachment(Message msg, String filename)
            throws MessagingException {

        MimeBodyPart p = new MimeBodyPart();

        // Добавление файла во вторую часть
        FileDataSource fds = new FileDataSource(filename);
        p.setDataHandler(new DataHandler(fds));
        p.setFileName(fds.getName());

        // Создание экземпляра класса Multipart. Добавление частей сообщения в него.
        Multipart mp = new MimeMultipart();
        mp.addBodyPart(p);

        // Установка экземпляра класса Multipart в качестве контента документа 
        msg.setContent(mp);
    }

    // Добавление в первую часть html-контента.
    // Оптправка данных любого другого типа производится аналогичным образом.
    public static void setHTMLContent(Message msg, String text) throws MessagingException {

        String html = "<html><body>" + text + "</body></html>";

        // HTMLDataSource является внутренним классом
        msg.setDataHandler(new DataHandler(new HTMLDataSource(html)));
    }

    /*
     * Внутренний класс работает аналогично JAF datasource и добавляет HTML в контент сообщения
     */
    public static class HTMLDataSource implements DataSource {
        private String html;

        public HTMLDataSource(String htmlString) {
            html = htmlString;
        }

        public String getName() {
            return "JAF text/html dataSource to send e-mail only";
        }

        public InputStream getInputStream() throws java.io.IOException{
            return new InputStream() {
                @Override
                public int read() throws IOException {
                    return 0;  //To change body of implemented methods use File | Settings | File Templates.
                }
            };
        }

        public OutputStream getOutputStream() throws java.io.IOException{
            return new OutputStream() {
                @Override
                public void write(int b) throws IOException {
                    //To change body of implemented methods use File | Settings | File Templates.
                }
            };
        }

        public String getContentType() {
            return "text/html";
        }

    }

}